﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ActionTrackerEntities;
using ActionTrackerRules.Base;
using ActionTrackerRules.Helpers;

namespace ActionTrackerRules
{
    public class AccionRules : RulesBase
    {
        #region Métodos
        
        public Accion GetById(int pIdAccion)
        {
            return GetDaoProvider().GetDaoAccion().GetById(pIdAccion);
        }

        public List<Accion> GetByFiltro(int? pIdUsuario, int? pIdReunion, int? pIdProyecto, EstadoAccionEnum? pEstadoAccion)
        {
            return GetDaoProvider().GetDaoAccion().GetByFiltro(pIdUsuario, pIdReunion, pIdProyecto, pEstadoAccion);
        }

        public List<ReporteAccionesVencidas> GetByReporteAccionesVencidas(DateTime pFecha, int pIdProyecto)
        {
            var entidadesAccion = GetDaoProvider().GetDaoAccion().GetByReporteAccionesVencidas(pFecha, pIdProyecto);
            List<ReporteAccionesVencidas> entidadesReporte= new List<ReporteAccionesVencidas>();
            foreach (var accion in entidadesAccion)
            {
                ReporteAccionesVencidas entidadReporte = new ReporteAccionesVencidas();
                entidadReporte.FechaInicio = accion.FechaInicio.HasValue ? accion.FechaInicio.Value.ToString("dd/MM/yyyy") : string.Empty; 
                entidadReporte.Descripcion = accion.Descripcion;
                entidadReporte.FechaVencimiento = accion.FechaVencimiento.ToString("dd/MM/yyyy");
                entidadReporte.Proyecto = accion.Proyecto.Objetivo;
                entidadReporte.Usuario = accion.Usuario.Nombre;
                entidadReporte.Reunion = accion.Reunion.Descripcion;
                entidadesReporte.Add(entidadReporte);
            }
            return entidadesReporte;
        }

        public List<MetricaPromedio> GetMetricasPromedioPorUsuario(int tipoMetrica, int? mes, int? anio, int idProyecto)
        {
            var entidades = GetDaoProvider().GetDaoAccion().GetMetricasPromedioUsuario(tipoMetrica, mes, anio, idProyecto);
            return entidades;
        }

        public List<MetricaCantidad> GetMetricasCantidadPorUsuario(int tipoMetrica, int? mes, int? anio, int idProyecto)
        {
            var entidades = GetDaoProvider().GetDaoAccion().GetMetricasCantidadUsuario(tipoMetrica, mes, anio, idProyecto);
            return entidades;
        }

        //public List<MetricaCantidad> GetMetricasCantidadPorUsuario()
        //{
        //    var entidades = GetDaoProvider().GetDaoAccion().GetMetricasCantidadUsuario();
        //    return entidades;
        //}

        //public List<MetricaCantidad> GetMetricasCantidadPorAnio()
        //{
        //    var entidades = GetDaoProvider().GetDaoAccion().GetMetricasCantidadAnio();
        //    return entidades;
        //}

        //public List<MetricaCantidad> GetMetricasCantidadPorMes()
        //{
        //    var entidades = GetDaoProvider().GetDaoAccion().GetMetricasCantidadMes();
        //    return entidades;
        //}

        public ResponseEnum Guardar(Accion pAccion)
        {
            try
            {
                if (GetDaoProvider().GetDaoAccion().ExisteAccionConNombre(pAccion.Descripcion,pAccion.IdProyecto,null))
                {
                    return ResponseEnum.EntidadExistente;
                }
                
                //busco el usuario, la reunión y el proyecto TODO: hacer que pase automaticamente de la vista
                pAccion.Usuario = GetDaoProvider().GetDaoUsuario().GetById(pAccion.IdUsuario);
                pAccion.Reunion = GetDaoProvider().GetDaoReunion().GetById(pAccion.IdReunion);
                pAccion.Proyecto = GetDaoProvider().GetDaoProyecto().GetById(pAccion.IdProyecto);
                
                //seteo el estado a Creada 
                pAccion.EstadoAccion = (int) EstadoAccionEnum.Abierta;

                //agrego la primera observación
                pAccion.Observacion = DateTime.Now.ToString("dd/MM/yyyy") + " - Se crea la acción \n";

                GetDaoProvider().GetDaoAccion().SaveOrUpdate(pAccion);
                return ResponseEnum.Ok;
            }
            catch (Exception ex)
            {
                return ResponseEnum.Error;
            }
        }

        public ResponseEnum Actualizar(Accion pAccion)
        {
            try
            {
                if (GetDaoProvider().GetDaoAccion().ExisteAccionConNombre(pAccion.Descripcion, pAccion.IdProyecto, pAccion.IdAccion))
                {
                    return ResponseEnum.EntidadExistente;
                }
                
                //busco el usuario, la reunión y el proyecto TODO: hacer que pase automaticamente de la vista
                pAccion.Usuario = GetDaoProvider().GetDaoUsuario().GetById(pAccion.IdUsuario);
                pAccion.Reunion = GetDaoProvider().GetDaoReunion().GetById(pAccion.IdReunion);
                pAccion.Proyecto = GetDaoProvider().GetDaoProyecto().GetById(pAccion.IdProyecto);

                pAccion.FechaInicio = GetDaoProvider().GetDaoAccion().GetById(pAccion.IdAccion).FechaInicio;
                
                //TODO: hacer que concatene un campo observaciones.
                if (pAccion.ObservacionNueva == null)
                {
                    pAccion.Observacion = GetDaoProvider().GetDaoAccion().GetById(pAccion.IdAccion).Observacion;
                }
                else
                {
                    pAccion.Observacion = GetDaoProvider().GetDaoAccion().GetById(pAccion.IdAccion).Observacion + " <br /> " + DateTime.Now.ToShortDateString() + " - " + pAccion.ObservacionNueva;
                }

                // si viene el Estado: Cerrada de la edición y no tiene fecha de fin, cierro la acción colocándole fecha de fin como hoy
                if (pAccion.EstadoAccion == (int)EstadoAccionEnum.Cerrada && !pAccion.FechaFin.HasValue)
                {
                    pAccion.FechaFin = DateTime.Now;
                }

                //si viene el Estado: Abierta y la fecha de fin tiene valor, quiere decir que reabrí la acción!
                if (pAccion.EstadoAccion == (int)EstadoAccionEnum.Abierta && pAccion.FechaFin.HasValue)
                {
                    pAccion.FechaFin = null;
                }

                GetDaoProvider().GetDaoAccion().SaveOrUpdate(pAccion);
                return ResponseEnum.Ok;
            }
            catch (Exception ex)
            {
                return ResponseEnum.Error;
            }
        }

        #endregion

        #region Soporte
        public string GetMes(int mes)
        {
            switch (mes)
            {
                case 1:
                    return "Enero";
                case 2:
                    return "Febrero";
                case 3:
                    return "Marzo";
                case 4:
                    return "Abril";
                case 5:
                    return "Mayo";
                case 6:
                    return "Junio";
                case 7:
                    return "Julio";
                case 8:
                    return "Agosto";
                case 9:
                    return "Septiembre";
                case 10:
                    return "Octubre";
                case 11:
                    return "Noviembre";
                case 12:
                    return "Diciembre";
            }
            return " ";
        }

        public Dictionary<int,string> GetAniosOMeses(int tipoMetricaPromedio)
        {
            var acciones = GetDaoProvider().GetDaoAccion().GetAniosOMeses(tipoMetricaPromedio);
            Dictionary<int,string> anios = new Dictionary<int, string>();
            switch (tipoMetricaPromedio)
            {
                case 1:
                    foreach (var action in acciones)
                    {
                        anios.Add(action.FechaFin.Value.Year,action.FechaFin.Value.Year.ToString());
                    }
                    break;  
                case 2:
                    foreach (var action in acciones)
                    {
                        anios.Add(action.FechaFin.Value.Month,GetMes(action.FechaFin.Value.Month));
                    }
                    break;
            }
            return anios;  
        }
        
        #endregion
    }
}
